﻿#ifndef WINDOW_MANAGER_H
#define WINDOW_MANAGER_H

//include定義
#include "Common.h"

class DeviceManager;

class WindowManager
{

public:
	//コンストラクタ
	WindowManager();

	//デストラクタ
	~WindowManager();

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　ウィンドウを作成する
	*	　※ ウィンドウを複数生成することにはまだ対応していないので注意 ※
	*	引数
	*	　p_Width	：[I/ ]　ウィンドウの幅
	*	　p_Height	：[I/ ]　ウィンドウの高さ
	*	　p_Title	：[I/ ]　ウィンドウの名前（ウィンドウ左上やタスクバーに表示される）
	*	戻り値
	*	　なし
	*-------------------------------------------------------------------------------*/
	void CreateNewWindow(const uint16_t p_Width, const uint16_t p_Height, const string &p_Title);

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　ウィンドウに描画する（フロントバッファ / バックバッファ 共通）
	*	引数
	*	　なし
	*	戻り値
	*	　なし
	*-------------------------------------------------------------------------------*/
	void DrawingOnWindow(void);

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　ウィンドウサイズが変化した時にコールバックされる関数
	*	引数
	*	　p_window	：[I/ ]　ウィンドウハンドル
	*	　p_Width	：[I/ ]　ウィンドウの幅
	*	　p_Height	：[I/ ]　ウィンドウの高さ
	*	　詳細は下記URL参照のこと
	*	　[http://www.glfw.org/docs/latest/group__window.html]の[GLFWmousebuttonfun]関数
	*	戻り値
	*	　なし
	*-------------------------------------------------------------------------------*/
	static void WindowSizeCallback(GLFWwindow* p_window, int p_Width, int p_Height);

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　作成したウィンドウハンドルを取得する
	*	引数
	*	　なし
	*	戻り値
	*	　ウィンドウハンドル
	*-------------------------------------------------------------------------------*/
	inline const GLFWwindow& GetWindow() const
	{
		return *m_window;
	}

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　作成したウィンドウのサイズを取得する
	*	引数
	*	　なし
	*	戻り値
	*	　ウィンドウハンドル
	*-------------------------------------------------------------------------------*/
	inline const uvec2& GetWindowSize() const
	{
		return m_WindowSize;
	}

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　作成したウィンドウが終了されたか（閉じられたか）を取得する
	*	引数
	*	　なし
	*	戻り値
	*	　閉じられている：GL_TRUE
	*	　閉じられていない：GL_FALSE
	*-------------------------------------------------------------------------------*/
	inline const uint16_t GetWindowShouldClose() const
	{
		return glfwWindowShouldClose(m_window);
	}

	/*-------------------------------------------------------------------------------
	*	関数説明
	*	　ウィンドウに紐付いているデバイスマネージャーを取得する（マウスやキーボードの情報）
	*	引数
	*	　なし
	*	戻り値
	*	　なし
	*-------------------------------------------------------------------------------*/
	inline shared_ptr<DeviceManager> GetDevice() const
	{
		return m_Device;
	}

private:
	GLFWwindow* m_window = nullptr;		//生成したウィンドウハンドル
	uvec2 m_WindowSize = { 0, 0 };		//生成したウィンドウのサイズ（幅,高さ）
	shared_ptr<DeviceManager> m_Device = nullptr;		//デバイス管理用のオブジェクト
};
#endif